﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace nl.hanze.i.web.t41
{
    class Populatie
    {
        private List<Mens> mensen;

        //
        //Constructors
        //

        public Populatie()
        {
            this.mensen = new List<Mens>();
        }

        public Populatie(List<Mens> mensen)
        {
            this.mensen = mensen;
        }

        //
        //Methoden
        //

        public void voegToe(Mens mens)
        {
            this.mensen.Add(mens);
        }

        public Boolean verwijder(long bsn)
        {
            //Gebruik LINQ om te verwijderen
            int removed = this.mensen.RemoveAll(o => o.Bsn == bsn.ToString());
            
            return removed > 0;
        }

        private Mens getMens(long bsn)
        {
            //Gebruik LINQ om te zoeken
            Mens gevondenMens = this.mensen.Find(
                delegate(Mens mens)
                {
                    return mens.Bsn.Equals(mens.fillupBsn(bsn.ToString()));
                });

            //Als geen mens gevonden is, wordt null teruggegeven
            return gevondenMens;
        }

        public List<Mens> geefVrouwen()
        {
            //Gebruik LINQ om te zoeken
            List<Mens> vrouwen = this.mensen.FindAll(
                delegate(Mens mens)
                {
                    return mens.Geslacht.Equals(Sexe.Vrouw);
                });

            return vrouwen;
        }

        public List<Mens> geefMannen()
        {
            //Gebruik LINQ om te zoeken
            List<Mens> mannen = this.mensen.FindAll(
                delegate(Mens mens)
                {
                    return mens.Geslacht.Equals(Sexe.Man);
                });

            return mannen;
        }

        public List<Mens> geefVanJongNaarOud()
        {
            // LINQ gebruiken om te sorteren
            List<Mens> gesorteerdOpLeeftijdAsc = this.mensen.OrderBy(o => o.Geboortedatum).ToList();

            return gesorteerdOpLeeftijdAsc;
        }

        /// <summary>
        /// Override van de ToString() methode
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            foreach (Mens mens in mensen)
            {
                sb.Append("Naam: ");
                sb.Append(mens.Naam);
                sb.Append(", BSN: ");
                sb.Append(mens.Bsn);
                sb.Append("\n");
            }
            return sb.ToString();
        }

        //
        //Indexers/Getters/Setters
        //

        public Mens this[long bsn]
        {
            get
            {
                return getMens(bsn);                
            }
        }
    }
}
